home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 68.7z / BS1 part 68 / EGS Retina For TVPaint Pro v2.0.1 AGA (1993)(-)(DE)(Diskette 2 of 2).7z / EGS Retina For TVPaint Pro v2.0.1 AGA (1993)(-)(DE)(Diskette 2 of 2).adf / Entwickler.lha / Entwickler / Entwickler.dok < prev    next >
Text File  |  1993-10-12  |  40KB  |  1,025 lines

  1. *********************************************************
  2. *                                                       *
  3. *                   Dokumentation                       *
  4. *                                                       *
  5. *                  für  Entwickler                      *
  6. *                                                       *
  7. *                    12.10.1993                         *
  8. *                                                       *
  9. *                     Cinema 4D                         *
  10. *                                                       *
  11. *********************************************************
  12.  
  13.  
  14. Das Koordinatensystem von Cinema4D ist so definiert, daß X- und Y- Achse in
  15. der Monitorebene liegen und die Z-Achse dazu senkrecht nach hinten zeigt.
  16. Cinema4D verwendet bei Dateien zur Speicherung von Koordinaten
  17. ausschließlich FFP-Variablen, wodurch die Kompatibilität des Dateiformats
  18. zur 68881-er Version, die intern mit LONGREAL-Variablen arbeitet,
  19. gewährleistet ist. Cinema4D-Erweiterungen dagegen müssen wie das
  20. Hauptprogramm in zwei Versionen vorliegen: eine 68000-er und eine 68881-er
  21. Version.
  22.  
  23. Bei der Erstellung von eigenen Programmen ist umbedingt darauf zu achten,
  24. daß alle Werte die Spezifikationen, die in dieser Dokumentation angegeben
  25. sind, erfüllen. Ist dies nicht der Fall, kann es zu unerwarteten Effekten
  26. oder sogar Systemabstürzen führen.
  27.  
  28. Sämtliche Deklarationen sind in Modula-2 aufgeführt; die Umsetzung dürfte
  29. aber C-Programmierern keine Schwierigkeit bereiten.
  30.  
  31. CONST
  32.   MINSIZE     = 0.001;
  33.   MAXREAL     = 1000000.0;
  34.   MAXELEMENTS = 65520;
  35.   MAXPOLYPNTS = 2500;
  36. TYPE
  37.   VEKTOR = RECORD
  38.              x,y,z : FFP;
  39.            END;
  40.  
  41.   Der Datentyp 'VEKTOR' wird als Vektor, Punkt und Farbe eingesetzt.
  42.   Wird er als Farbe verwendet, entspricht der x-Komponente der Rotanteil,
  43.   der y-Komponente der Grünanteil und der z-Komponente der Blauanteil. Jede
  44.   Komponente muß größer oder gleich null und kleiner gleich eins sein.
  45.   Wird 'VEKTOR' als Punkt verwendet, so sollten die einzelnen Komponenten
  46.   zwischen -MAXREAL und +MAXREAL liegen. Dies gilt nicht nur für Punkte,
  47.   sondern auch für Abstände, Radien usw..
  48.  
  49.  
  50.   Darst  = (keine,quader,voll);
  51.  
  52.   Darstellung von Körpern und Polygonen :
  53.   keine  : keine Darstellung
  54.   quader : Darstellung durch einenumhüllende Quader
  55.   voll   : Volldarstellung
  56.  
  57.  
  58.   MATRIX    = ARRAY [0..3],[0..3] OF FFP;
  59.  
  60.   Matrix zur Speicherung einer dreidimensionalen Transformation. Im Fall
  61.   eines Körpers muß die Matrix auf folgende Werte gesetzt werden:
  62.  
  63.   m[0,0]:=1.0;  m[0,1]:=0.0;  m[0,2]:=0.0;  m[0,3]:=0.0;
  64.   m[1,0]:=mp.x; m[1,1]:=v1.x; m[1,2]:=v2.x; m[1,3]:=v3.x;
  65.   m[2,0]:=mp.y; m[2,1]:=v1.y; m[2,2]:=v2.y; m[2,3]:=v3.y;
  66.   m[3,0]:=mp.z; m[3,1]:=v1.z; m[3,2]:=v2.z; m[3,3]:=v3.z;
  67.  
  68.   Die Matrix dient dem Programm dazu, den Quader, der beim Verschieben,
  69.   Skalieren und Drehen auf dem Bildschirm erscheint, zu berechnen.
  70.  
  71.     5------------6       v2
  72.    /|           /|       |  v3
  73.   1-+----------2 |       | /
  74.   | |          | |       |/
  75.   | |    9     | |       +----- v1
  76.   | |          | |
  77.   | 7----------+-8
  78.   |/           |/
  79.   3------------4
  80.  
  81.   Die Punkte (1)-(9) ergeben sich folgendermaßend :
  82.  
  83.   (1) : mp-v1+v2-v3
  84.   (2) : mp+v1+v2-v3
  85.   (3) : mp-v1-v2-v3
  86.   (4) : mp+v1-v2-v3
  87.   (5) : mp-v1+v2+v3
  88.   (6) : mp+v1+v2+v3
  89.   (7) : mp-v1-v2+v3
  90.   (8) : mp+v1-v2+v3
  91.   (9) : mp
  92.  
  93.   Bei einem neu erzeugten Körper ist die Körpermatrix meistens noch
  94.   ungedreht, das heißt parallel zum Weltkoordinatensystem.
  95.   Wird ein Körper gedreht, muß auch die Matrix mitgedreht werden. Wird es
  96.   Verschoben, muß die Matrix verschoben werden. Ebenso muß bei einer
  97.   Skalierung oder Spiegelung die Matrix geändert werden. Die Vektoren
  98.   'v1', 'v2' und 'v3' müssen immer genau so lang sein, daß alle Punkte des
  99.   Körpers innerhalb der Begrenzungsbox liegen. Sie dürfen minimal eine
  100.   Länge von 'MINSIZE' (oben definiert) haben, auch wenn der Körper kleiner
  101.   ist. 'mp' ist der Mittelpunkt des gedrehten Systems, nicht der
  102.   Mittelpunkt in Weltkoordinaten.
  103.  
  104.  
  105.   STRING = ARRAY [0..15] OF CHAR;
  106.  
  107.   Zeichenkette für Körper-, Lichtquellen- und Polygonnamen. Die
  108.   Zeichenkette muß mindestens ein Zeichen enthalten.
  109.  
  110.  
  111.   STRING64 = ARRAY [0..63] OF CHAR;
  112.  
  113.   Zeichenkette für Texturnamen. Die Zeichenkette muß mindestens
  114.   ein Zeichen enthalten.
  115.  
  116.  
  117.   LichtFlags   = (schattenwurf,spot,abnahme,parallel);
  118.   LichtFlagSet = SET OF LichtFlags;
  119.  
  120.   Flags einer Lichtquelle. Damit kann festgelegt werden, ob die Lichtquelle
  121.   Schatten werfen soll, ob sie eine Spotlichtquelle ist, ob ihre
  122.   Lichtintensität bei zunehmender Entfernung abnimmt, und ob sie parallele
  123.   Lichtstrahlen aussendet.
  124.  
  125.  
  126.   LichtPtr     = POINTER TO LICHT;
  127.   LICHT        = RECORD
  128.                    name       : STRING;
  129.                    flags      : LichtFlagSet;
  130.                    p,f,p2     : VEKTOR;
  131.                    abn,w,hell : FFP;
  132.                    nextlicht  : LichtPtr;
  133.                  END;
  134.  
  135.   'name' gibt den Lichtquellennamen an. 'p' ist die Position, an der sich
  136.   die Lichtquelle befindet. 'f' ist die Farbe der Lichtquelle. 'p2' gibt
  137.   die Zielposition der Lichtquelle an (für Spot- und Parallellicht). 'P2'
  138.   muß umbedingt von 'p' verschieden sein, selbst wenn 'p2' nicht benutzt
  139.   wird. 'abn' ist ein positiver Wert größer null. Er gibt an, wie weit die
  140.   Lichtquelle strahlt.Dazwischen wird linear die Abnahme berechnet (d.h.
  141.   Entfernung 0 = 100%, 'abn'/2 = 50%, 'abn' = 0%). Die Helligkeit ist ein
  142.   Wert größer Null und kleiner gleich 10. Er gibt die Helligkeit der
  143.   Lichtquelle an. Der Wert 1 entspricht 100%. 'w' hat je nach
  144.   Lichtquellenart verschiedene Bedeutungen : handelt es sich um eine
  145.   Spot-/Parallellichtquelle, dann steht in 'w' ein Wert größer null, der
  146.   den Radius des Lichtzylinders angibt. Handelt es sich dagegen um eine
  147.   Spotlichtquelle ohne Parallellicht, dann gibt 'w' den gesamten
  148.   Abstrahlwinkel des Lichtkegels an. 'w' muß dann größer null und kleiner
  149.   360 sein. 'nextlicht' ist ein Zeiger auf die nächste Lichtquelle.
  150.  
  151.  
  152.   KAMERA       = RECORD
  153.                    p1,p2    : VEKTOR;
  154.                    f,w,zoom : FFP;
  155.                    v1,v2,v3 : VEKTOR;
  156.                  END;
  157.  
  158.   'p1' ist die Position der Kamera, 'p2' der Zielpunkt. Position und
  159.   Zielpunkt müssen voneinander verschieden sein. 'f'/2.8 gibt die
  160.   Brennweite der Kamera an. 'f' muß größer gleich 2.8 sein. 'w' legt den
  161.   Neigungswinkel der Kamera fest. 'zoom' ist der Zoomfaktor, der größer
  162.   gleich 0.001 und kleiner gleich 1000.0 sein muß. 'v1', 'v2' und 'v3'
  163.   geben die Kameravektoren an. Die Initialisierung übernimmt Cinema4D.
  164.  
  165.  
  166.   TexFlags   = (Farbe,Trans,Relief,Spieg);
  167.   TexFlagSet = SET OF TexFlags;
  168.  
  169.   Die 'TexFlags' geben an für welche der Texturarten eine Bedingung
  170.   erfüllt ist.
  171.  
  172.  
  173.   MaterialPtr = POINTER TO MATERIAL;
  174.   MATERIAL    = RECORD
  175.                   name                : ARRAY [0..23] OF CHAR;
  176.                   f,t,v               : VEKTOR;
  177.                   h,brech,winkel,
  178.                    abn,leucht         : FLOAT;
  179.                   ftex,ttex,stex,rtex : STRING64;
  180.                   selbst,nebel        : BOOLEAN;
  181.                   tex,verlauf,eckig   : TexFlagSet;
  182.                   nofresnel           : BOOLEAN;
  183.                   reserved            : ARRAY [0..15] OF CHAR;
  184.                   nextmat             : MaterialPtr;
  185.                 END;
  186.  
  187.   In 'name' steht der Materialname. Die Zeichenkette muß mindestens ein
  188.   Zeichen enthalten. 'f','t' und 'v' sind Farbwerte und geben
  189.   Materialfarbe, Transparenz und Spiegelung an. 'h' ist die Oberflächengüte
  190.   und muß größer gleich 0 und kleiner gleich 100 sein. 0 bedeutet kein
  191.   Glanzlicht. Werte größer Null erzeugen ein Glanzlicht. Je größer der
  192.   Wert, desto kleiner das Glanzlicht (Umgekehrt zur Benutzereingabe!). In
  193.   'brech' steht der Brechungsindex des Materials. Er muß größer gleich 0.25
  194.   und kleiner gleich 4 sein. 'winkel' ist der Winkel für Relieftexturen.
  195.   Er muß größer null und kleiner gleich 100 sein.In 'abn' steht die Abnahme
  196.   von Lichtstrahlen bei Nebel. 'abn' muß größer Null sein. Es folgen in
  197.   'ftex', 'ttex', 'stex' und 'rtex' die Pfade für Farb-, Transparenz-,
  198.   Spiegel- und Relieftexturen. 'selbst' gibt an, ob das Material
  199.   selbstleuchtend ist. Mit 'leucht' legen Sie den selbstleuchtenden Anteil
  200.   fest. In 'tex' steht, welche Texturen gerade angeschaltet
  201.   sind. Ist das entsprechende Flag in 'verlauf' gesetzt, dann handelt es
  202.   sich um eine Verlaufstextur. Ist das Flag in 'eckig' gesetzt, wird ein
  203.   Misch-Verlauf, ansonsten ein Punkt-Verlauf berechnet. 'nebel' gibt an,
  204.   ob das Material als Nebel verwendet werden soll. 'nofresnel' gibt an,
  205.   ob die Brechung bzw. das Transparenz- und Spieglungsverhalten physikalisch
  206.   korrekt erfolgen soll (true=nein, false=ja, für genauere Angaben siehe
  207.   Handbuch). 'nextmat' ist der Zeiger auf das nächste Material.
  208.  
  209.  
  210.   PROJEKTION  = (Kug,Zylinder,Flaeche);
  211.  
  212.   Textur-Projektionsart : Kugel/Zylinder/Fläche
  213.  
  214.  
  215.   TexInfoPtr  = POINTER TO TEXINFO;
  216.   TEXINFO     = RECORD
  217.                   mp,v1,v2,v3     : VEKTOR;
  218.                   ox,oy,lenx,leny : FFP;
  219.                   mehrfach        : BOOLEAN;
  220.                   projekt         : PROJEKTION;
  221.                 END;
  222.  
  223.   'TEXINFO' ist die Textur-Information eines Körpers. 'mp', 'v1', 'v2' und
  224.   'v3' sind diesmal nicht in einer Matrix gespeichert, sondern als
  225.   Vektoren. Sie haben die gleiche Bedeutung wie oben besprochen, diesmal
  226.   aber nicht für die Körper-Box sondern für die Textur-Box. 'ox' und 'oy'
  227.   stellen den Offset des Texturbildes dar (siehe Offset.iff). 'lenx' und
  228.   'leny' geben die Größe des Texturbildes an und müssen größer gleich -1
  229.   und kleiner gleich 1 sein. Sie dürfen nicht auf 0 gesetzt werden, es sei
  230.   denn, es handelt sich um ein Pseudo-Körper. Mit 'mehrfach' wird festgelegt,
  231.   ob es sich um eine Mehrfachtextur handelt. Schließlich gibt 'projekt' noch
  232.   die Projektion an. Bei der Zylinder- und Kugelprojektion darf 'ox' nicht
  233.   beliebig gewählt werden. Dies gilt auch für 'oy' bei Kugelprojektion.
  234.   Ist 'lenx' positiv so muß 'ox' minimal auf 0 und maximal auf 1-'lenx'
  235.   gesetzt werden. Ansonsten darf 'ox' minimal 1+lenx und maximal 1
  236.   betragen. Mit 'oy' verhält es sich dementsprechend.
  237.  
  238.  
  239.   KOERPERTYP = (Kugel,Flaechen,Pseudo);
  240.   Art des Körpers: Kugel, Körper aus Flächen oder Verzeichnis
  241.  
  242.  
  243.   KorperPtr   = POINTER TO KOERPER;
  244.   KOERPER     = RECORD
  245.                   CASE typ:KOERPERTYP OF
  246.                     | Flaechen : panz,danz,vanz,kanz   : LONGINT;
  247.                                  padr,dadr,vadr,kadr   : ADDRESS;
  248.                     | Pseudo   : adr                   : KoerperPtr;
  249.                                  reserved1             : ARRAY [0..27] OF CHAR;
  250.                     | Kugel    : reserved2             : ARRAY [0..31] OF CHAR;
  251.                   END;
  252.                   mp,r         : VEKTOR;
  253.                   matrix       : MATRIX;
  254.                   name         : STRING;
  255.                   info         : TEXINFO;
  256.                   phong        : BOOLEAN;
  257.                   darst        : Darst;
  258.                   mat          : MaterialPtr;
  259.                   reserved     : ARRAY [0..11] OF CHAR;
  260.                   next         : KoerperPtr;
  261.                 END;
  262.  
  263.   'typ' gibt an, um was für ein Körper es sicht handelt. Ist es ein aus
  264.   Flächen aufgebauter Körper, dann folgen in 'panz' die Anzahl der Punkte,
  265.   in 'danz' die Anzahl der Dreiecke, in 'vanz' die Anzahl der Vierecke und
  266.   in 'kanz' die Anzahl der Kanten. Anschließend sind die entsprechenden
  267.   Adressen vermerkt.'panz' und 'kanz' und entweder 'danz' oder 'vanz' oder
  268.   beide müssen größer null sein. Entsprechend müssen die Adressen ungleich
  269.   NIL sein. Ab 'padr' folgen 'panz' Punkte des Körpers, als Vektoren
  270.   gespeichert (d.h. 12 Bytes pro Punkt). Dreiecke bestehen aus drei
  271.   CARDINAL-Nummern. Jede Nummer gibt dabei einen Punkt an (beginnend mit
  272.   null). Ebenso sind Vierecke gespeichert, allerdings durch vier
  273.   CARDINAL-Nummern. Kanten werden durch zwei CARDINAL-Nummern gespeichert.
  274.   Die Anzahl von Punkten, Kanten, Dreiecken und Vierecken ist auf
  275.   'MAXELEMENTS' begrenzt. Es ist umbedingt wichtig, daß die Kanten korrekt
  276.   angelegt werden, daß heißt jede Kante darf nur einmal vorkommen.
  277.   Handelt es sich um ein Körperverzeichnis ('Pseudo'), dann steht in 'adr'
  278.   ein Zeiger auf den ersten untergeordneten Körper. Der nächste Körper auf
  279.   gleicher Ebene dagegen ist in 'next' vermerkt. Es ist zwingend
  280.   erforderlich, Körper korrekt zu verknüpfen, da sich sonst Cinema4D in
  281.   einer Endlosschleife aufhängt.
  282.   In 'mp' und 'r' stehen Mittelpunkt und Radius des Körpers im
  283.   Weltkoordinatensystem. Es handelt sich dabei um vollkommen andere Werte
  284.   als die in 'matrix' gespeicherten, da diese sich auf das
  285.   Körperkoordinatensystem beziehen. Jede Komponente von r muß größer gleich
  286.   null sein. In 'name' steht der Körpername, in 'info' die Textur-
  287.   Information. 'phong' gibt an, ob der Körper mit Phong-Shading berechnet
  288.   werden soll. Dazu müssen aber alle Dreiecke und Vierecke einheitlich
  289.   ausgerichtet sein. In 'darst' ist vermerkt, wie der Körper im Editor
  290.   dargestellt wird. 'mat' ist ein Zeiger auf das dem Körper zugeordneten
  291.   Material. Wenn 'mat' auf NIL steht, dann wird ein Standardmaterial
  292.   verwendet.
  293.   Für ein Körperverzeichnis muß nur ein Teil seiner Matrix initialisiert
  294.   sein. Die drei Basisvektoren geben nur die Richtungen angeben, ihre
  295.   Längen dagegen sind unwichtig. Der Mittelpunkt der Matrix muß nicht
  296.   initialisiert werden und sollte auf den Weltkoordinatenursprung (0/0/0)
  297.   gesetzt werden.
  298.  
  299.  
  300.   SplineArt   = (Linear,Kubisch,Akima,BSpline);
  301.  
  302.   PolygonPtr  = POINTER TO POLYGON;
  303.   POLYGON     = RECORD
  304.                   name        : STRING;
  305.                   panz        : LONGINT;
  306.                   splineart   : SplineArt;
  307.                   geschlossen : BOOLEAN;
  308.                   darst       : Darst;
  309.                   mp,r        : VEKTOR;
  310.                   padr        : ADDRESS;
  311.                   koadr       : ADDRESS;
  312.                   next        : PolygonPtr;
  313.                 END;
  314.  
  315.   In 'name' steht der Name des Polygons. 'panz' muß größer 1 sein und darf
  316.   maximal 'MAXPOLYPNTS' betragen. In 'splineart' steht die Art des
  317.   Polygons. geschlossen gibt an, ob das Polygon geschlossen ist, oder
  318.   nicht. 'darst' gibt an, wie das Polygon im Editor dargestellt wird.
  319.   'mp' und 'r' geben Mittelpunkt und Radius des Polygons in Weltkoordinaten
  320.   an, wobei jede Komponente des Radius größer gleich null sein muß. 'padr'
  321.   ist ein Zeiger auf die Punkte des Polygons. Bei nichtlinearen Polygonen
  322.   sind zusätzlich noch in koadr Koeffizienten abgespeichert, die das
  323.   Arbeiten im Editor beschleunigen. Die Berechnung ist sehr aufwendig.
  324.   Verändern Sie deshalb bitte nur lineare Polygone.
  325.   'next' ist ein Zeiger auf das nächste Polygon.
  326.  
  327.  
  328.   HintergrundFlags   = (nebel,tex,verlauf,eckig);
  329.   HintergrundFlagSet = SET OF HintergrundFlags;
  330.  
  331.   HINTERGRUND = RECORD
  332.                   f,t       : VEKTOR;
  333.                   abn       : FFP;
  334.                   flags     : HintergrundFlagSet;
  335.                   reserved  : BOOLEAN;
  336.                   iffname   : STRING64;
  337.                   reserved2 : ARRAY [0..3] OF CHAR;
  338.                 END;
  339.  
  340.   Hintergrundsdefinition einer Szene. In 'f' und 't' stehen Farbe und
  341.   Transparenz des Hintergrunds (Transparenz des Nebels). In 'iffname' steht
  342.   der Name der Textur. Die Bedeutung der restlichen Werte kann bei
  343.   'MATERIAL' nachgelesen werden.
  344.  
  345.  
  346.   BODEN     = RECORD
  347.                 ex   : BOOLEAN;
  348.                 mat  : MaterialPtr;
  349.                 info : TEXINFO;
  350.               END;
  351.  
  352.   In 'ex' ist vermerkt, ob der Boden angeschaltet ist. 'mat' ist ein Zeiger
  353.   auf das verwendete Material und 'info' ist die Textur-Information.
  354.  
  355.  
  356.   UMGEBUNG = RECORD
  357.                boden,himmel : BODEN;
  358.                xyzkamera    : KAMERA;
  359.                hintergrund  : HINTERGRUND;
  360.              END;
  361.  
  362.   Definition der Szenenumgebung : Boden, Himmel, Kamera und Hintergrund
  363.  
  364.  
  365.   WEITER = SET OF (next,reserved1,reserved2,pseudoempty);
  366.  
  367.  
  368.  
  369. Alle diese Definitionen geben an, wie Körper, Polygone, Lichtquellen usw.
  370. im Hauptspeicher angegeben sind. Wer Erweiterungen für Cinema4D
  371. programmiert, kann damit direkt darauf zugreifen.
  372.  
  373. ************************************************************************************************
  374.  
  375. Das Dateiformat von Cinema4D ist ein IFF-Format. Die FORM-ID heißt 'FRAY'.
  376. Es gibt mehrere Chunks:
  377.  
  378. 'POLY' : Dieser Chunk enthält alle Polygone. Wenn er vorhanden ist,
  379.          enthält er mindestens ein Polygon. Dieser Chunk sollte als Erster gespeichert werden,
  380.          da andere Chunks auf ihn eventuell Referenzen haben.
  381.  
  382. 'FRE1' : Dieser Chunk enthält sämtliche Requester-Einstellungen des Editors. Er sollte
  383.          vor den restlichen Chunks abgespeichert werden.
  384.  
  385. 'MAT1' : Dieser Chunk enthält alle Materialien. Er muß -falls vorhanden-
  386.          vor dem 'OBJ1' und 'UMG1'-Chunk stehen, da diese Chunks
  387.          Materialnummern enthalten und sich auf den 'MAT1'-Chunk beziehen.
  388.          Wenn der 'MAT1'-Chunk vorhanden ist, dann enthält er mindestens
  389.          ein Material.
  390.  
  391. 'UMG1' : Dieser Chunk enthält die Umgebungsdaten einer Szene.
  392.  
  393. 'OBJ1' : Dieser Chunk enthält alle Körper. Wenn er vorhanden ist, enthält
  394.          er mindestens einen Körper.
  395.  
  396. 'LAM1' : Dieser Chunk enthält alle Lichtquellen. Wenn er vorhanden ist,
  397.          enthält er mindestens eine Lichtquelle.
  398.  
  399. 'ANIM' : Dieser Chunk enthält sämtliche Animationsdaten.
  400.  
  401. 'CPPL' : Dieser Chunk enthält sämtliche Polygonlisten der
  402.          Polygonfunktionen. Er kommt vor, wenn es auch einen 'FRE1'-Chunk
  403.          gibt.
  404.  
  405.  
  406. 'MAT1'-Chunk
  407. ************
  408.  
  409. REPEAT
  410.   Lese Material.name bis Material.nebel (342 Bytes)
  411.   Lese Weiter (1 Byte)
  412. UNTIL NOT(next IN Weiter);
  413.  
  414. Falls Chunklänge ungerade : ein Dummybyte lesen
  415.  
  416. Auszug aus einer Beispielsdatei (Material mit dem Namen 'Rotes Plastik',
  417.                                  einer Farbtextur und einer Relieftextur)
  418.  
  419.                            4D415431                MAT1
  420. 00000157 4D61726D 6F720064 00000000    ...WMarmor.d....
  421. 00000000 00000000 00000000 80000041    ...............A
  422. 00000000 80000040 00000000 00000000    .......@........
  423. 00000000 99999A3F 99999A3F 99999A3F    .......?...?...?
  424. A1FFFF47 80000041 A0000045 C8000047    ¡..G...A ..EÈ..G
  425. 80000041 54657874 7572656E 2F4D6172    ...ATexturen/Mar
  426. 6D6F7200 00000000 00000000 00000000    mor.............
  427. 00000000 00000000 00000000 00000000    ................
  428. 00000000 00000000 00000000 00000000    ................
  429. 00000000 00000000 00000000 00000000    ................
  430. 00000000 00000000 00000000 00000000    ................
  431. 00000000 00000000 00000000 00000000    ................
  432. 00000000 00000000 00000000 00000000    ................
  433. 00000000 00000000 00000000 00000000    ................
  434. 00000000 00000000 00000000 00000000    ................
  435. 00000000 00000000 00000000 00000000    ................
  436. 00000000 00000000 00000000 00000000    ................
  437. 00000000 54657874 7572656E 2F4D6172    ....Texturen/Mar
  438. 6D6F722D 48F66865 6E766572 6C617566    mor-Höhenverlauf
  439. 00000000 00000000 00000000 00000000    ................
  440. 00000000 00000000 00000000 00000000    ................
  441. 00000000 0000050F 00000000             ............
  442.  
  443.  
  444. 'LAM1'-Chunk
  445. ************
  446.  
  447. Wiederhole
  448.   Lese Licht.name bis Licht.hell (66 Bytes)
  449.   Lese Weiter (1 Byte)
  450. Bis NOT(next IN Weiter);
  451.  
  452. Falls Chunklänge ungerade : ein Dummybyte lesen
  453.  
  454. Auszug aus einer Beispielsdatei (Spot-Lichtquelle mit dem Namen 'Licht')
  455.  
  456.                       4C41 4D310000              LAM1..
  457. 00434C69 63687400 00000000 00000000    .CLicht.........
  458. 00000200 A00000C9 F0000048 00000000    .... ..Éð..H....
  459. 80000041 80000041 80000041 00000000    ...A...A...A....
  460. 00000000 C8000047 C8000047 F0000045    ....È..GÈ..Gð..E
  461. 80000041 0200                          ...A..
  462.  
  463.  
  464. 'POLY'-Chunk
  465. ************
  466.  
  467. Wiederhole
  468.   Lese Polygon.name bis Polygon.darst (23 Bytes)
  469.   Lese Polygon.mp bis Polygon.r (24 Bytes)
  470.   Lese Polygonpunkte (12*Polygon.panz Bytes)
  471.   Falls Polygon.splineart#Linear dann
  472.     Lese Koeffizienten (BSpline: 4 Bytes,
  473.                         Kubisch: 48*(Polygon.panz+1) Bytes,
  474.                         Akima: 48*(Polygon.panz+5) Bytes)
  475.   Lese Weiter (1 Byte)
  476. Bis NOT(next IN Weiter);
  477.  
  478. Falls Chunklänge ungerade : ein Dummybyte lesen
  479.  
  480. Auszug aus einer Beispielsdatei (Lineares Polygon mit dem Namen 'Polygon')
  481.  
  482.              504F 4C590000 0060506F          POLY...`Po
  483. 6C79676F 6E000000 00000000 00000000    lygon...........
  484. 00040000 02C80000 C6F00000 44000000    .....È..Æð..D...
  485. 00C80000 49848000 49000000 00E10000    .È..I...I....á..
  486. C9D20000 48000000 00FA0000 C8FA0000    ÉÒ..H....ú..Èú..
  487. C8000000 00D20000 488C0000 C8000000    È....Ò..H...È...
  488. 00AF0000 498C0000 49000000 0002        .¯..I...I.....
  489.  
  490.  
  491. 'OBJ1'-Chunk
  492. ************
  493.  
  494. Da Körper Unterkörper haben können, ist der 'OBJ1'-Chunk rekursiv
  495. verschachtelt.
  496.  
  497. Prozedur LadeKörper
  498.   Wiederhole
  499.     Lese Koerper.art (1 Byte)
  500.     Lese Koerper.mp bis Koerper.darst (172 Bytes)
  501.     Lese Materialnummer (2 Bytes)  Die Materialnummer muß beim Laden in
  502.                                    einen MaterialPtr umgewandelt werden.
  503.                                    -1 bedeutet, daß Koerper.mat auf NIL
  504.                                    gesetzt wird, 0 bedeutet, daß
  505.                                    Koerper.mat auf das erste aus dem
  506.                                    'MAT '-Chunk gelesene Material gesetzt
  507.                                    wird.
  508.  
  509.     Falls Koerper.art=Flaechen dann
  510.       Lese Koerper.panz bis Koerper.kanz (16 Bytes)
  511.       Lese Koerperpunkte (12*Koerper.panz Bytes)
  512.       Lese Koerperkanten (4*Koerper.kanz Bytes)
  513.       Falls Koerper.danz>0 dann
  514.         Lese Koerperdreiecke (6*Koerper.danz Bytes)
  515.       Falls Koerper.vanz>0 dann
  516.         Lese Koerpervierecke (8*Koerper.vanz Bytes)
  517.     Falls Koerper.art=Pseudo dann
  518.       Falls NOT(pseudoempty IN Weiter) dann
  519.         LadeKörper; (nächste Hierarchie-Ebene laden)
  520.   Bis NOT(next IN Weiter);
  521. Ende LadeKörper
  522.  
  523. Falls Chunklänge ungerade : ein Dummybyte lesen
  524.  
  525. Auszug aus einer Beispielsdatei (Körper 'Verzeichnis' mit Unterkörper
  526.                                  'Scheibe')
  527.  
  528.              4F42 4A310000 02B40200          OBJ1...´..
  529. 00000000 00000000 00000000 00000000    ................
  530. 00000000 00000080 00004100 00000000    ..........A.....
  531. 00000000 00000000 00000080 00004100    ..............A.
  532. 00000000 00000000 00000000 00000080    ................
  533. 00004100 00000000 00000000 00000000    ..A.............
  534. 00000080 00004156 65727A65 6963686E    ......AVerzeichn
  535. 69730000 00000000 00000000 00000000    is..............
  536. 00000080 00004100 00000000 00000000    ......A.........
  537. 00000080 00004100 00000000 00000000    ......A.........
  538. 00000080 00004180 0000C080 0000C000    ......A...À...À.
  539. 00000000 000000FF 020002FF FF040100    ................
  540. 00000000 00000000 000000C8 00004700    ...........È..G.
  541. 000000C8 00004780 00004100 00000000    ...È..G...A.....
  542. 00000000 00000000 000000C8 00004700    ...........È..G.
  543. 00000000 00000000 00000000 00000083    ................
  544. 126F3600 00000000 00000000 00000000    .o6.............
  545. 000000C8 00004753 63686569 62650000    ...È..GScheibe..
  546. 00000000 00000000 00000000 00000000    ................
  547. 000000C8 00004700 00000000 00000000    ...È..G.........
  548. 00000000 000000C8 00004700 00000083    .......È..G.....
  549. 126F3600 00000080 0000C080 0000C080    .o6.......À...À.
  550. 00004180 000041FF 020002FF FF000000    ..A...A.........
  551. 0D000000 0C000000 00000000 18020000    ................
  552. 00000000 0000C800 0047C800 00460000    ......È..GÈ..F..
  553. 0000AD34 8047AD34 80470000 0000C800    ..­4.G­4.G....È.
  554. 0046C800 00470000 0000DC9B 0011AD34    .FÈ..G....Ü...­4
  555. 80470000 0000C800 00C6C800 00460000    .G....È..ÆÈ..F..
  556. 0000AD34 80C7FF26 C0140000 0000C800    ..­4.Ç.&À.....È.
  557. 00C7C800 00C60000 0000AD34 80C7AD34    .ÇÈ..Æ....­4.Ç­4
  558. 80C70000 0000C800 00C6C800 00C70000    .Ç....È..ÆÈ..Ç..
  559. 0000A574 4093AD34 80C70000 0000C800    ..¥t@.­4.Ç....È.
  560. 0046C800 00C60000 0000AD34 80470000    .FÈ..Æ....­4.G..
  561. 00000000 00000000 0000000A 000C0001    ................
  562. 0002000A 000B0008 00090009 000C0008    ................
  563. 000C0006 00070002 000C0000 000C0003    ................
  564. 000C0002 00030001 000C0003 00040000    ................
  565. 00010004 000C0007 00080000 000B000B    ................
  566. 000C0004 00050005 000C0009 000A0006    ................
  567. 000C0007 000C0005 00060000 0001000C    ................
  568. 00010002 000C0002 0003000C 00030004    ................
  569. 000C0004 0005000C 00050006 000C0006    ................
  570. 0007000C 00070008 000C0008 0009000C    ................
  571. 0009000A 000C000A 000B000C 000B0000    ................
  572. 000C                                   ..
  573.  
  574.  
  575. 'UMG1'-Chunk
  576. ************
  577.  
  578. Lese Boden.ex (1 Byte)
  579. Lese Himmel.ex (1 Byte)
  580. Lese Materialnummer des Bodens (2 Bytes, siehe 'OBJ1'-Chunk)
  581. Lese Materialnummer des Himmels (2 Bytes, siehe 'OBJ1'-Chunk)
  582. Lese Boden.info (66 Bytes)
  583. Lese Himmel.info (66 Bytes)
  584. Lese Kamera.p1 bis Kamera.zoom (36 Bytes)
  585. Lese Hintergrund.f bis Hintergrund.iffname (94 Bytes)
  586.  
  587. Auszug aus einer Beispielsdatei
  588.  
  589.              554D 47310000 010C0000          UMG1......
  590. FFFFFFFF 00000000 00000000 00000000    ................
  591. FA000049 00000000 00000000 00000000    ú..I............
  592. 00000000 FA000049 00000000 80000041    ....ú..I.......A
  593. 00000000 800000C0 800000C0 80000041    .......À...À...A
  594. 80000041 FF020000 00000000 00000000    ...A............
  595. 0000FA00 00490000 00000000 00000000    ..ú..I..........
  596. 0000FA00 00490000 00000000 00000000    ..ú..I..........
  597. 0000FA00 00490000 00008000 00C08000    ..ú..I.......À..
  598. 00418000 0041FF00 9600004A 9600004A    .A...A.....J...J
  599. FA0000CA 00000000 00000000 00000000    ú..Ê............
  600. 8C000048 00000000 80000041 CCCCCD3E    ...H.......AÌÌÍ>
  601. CCCCCD3E CCCCCD3E 80000041 80000041    ÌÌÍ>ÌÌÍ>...A...A
  602. 80000041 C8000047 04000000 00000000    ...AÈ..G........
  603. 00000000 00000000 00000000 00000000    ................
  604. 00000000 00000000 00000000 00000000    ................
  605. 00000000 00000000 00000000 00000000    ................
  606. 00000000 00000000 0000                 ..........
  607.  
  608.  
  609. 'FRE1'-Chunk
  610. ************
  611.  
  612. Lese ansicht (1 Byte)
  613. Lese quadrant (1 Byte)
  614. Lese zoom (4 Bytes)
  615. Lese mittelpunkt (12 Bytes)
  616.  
  617. Der 'FRE1'-Chunk ist ein sehr langer Chunk mit mehr als 2 KB Daten. Er
  618. enthält sämtliche Requestereinstellungen. Von Interesse dürften aber nur
  619. die ersten 18 Bytes sein. Darin sind Daten über den sichtbaren Ausschnitt
  620. in den 2D-Ansichten enthalten. Wenn Sie solch einen 'FRE1'-Chunk
  621. abspeichern wollen, dann reicht es, diese 18 Bytes zu speichern. Cinema4D
  622. erkennt, daß es sich dabei nicht um die 'Vollversion' des Chunks handelt
  623. und übernimmt nur diese Parameter.
  624. In 'ansicht' steht die sichtbare Ansicht (0=XY, 1=ZY, 2=XZ, 3=3D, 4=4T).
  625. In 'quadrant' steht nochmals der gleiche Wert, es sei denn 4T ist
  626. eingestellt. In diesem Fall muß 'quadrant' auf XY, ZY, XZ oder 3D stehen.
  627. 'zoom' ist ein FFP-Wert und gibt den Zoomfaktor an, der sich im Bereich
  628. von 0.001 bis 1000 bewegen darf. 'mittelpunkt' ist ein Vektor, der den
  629. Mittelpunkt des sichtbaren Ausschnitts festlegt.
  630.  
  631. Auszug aus einer Beispielsdatei
  632.  
  633. 4B494C31 00000012 04003FF0 00000000 FRE1......?ð...
  634. 00000000 00000000 0000              ...........
  635.  
  636.  
  637. Zur Verdeutlichung des Ganzen folgt eine Routine zum Speichern von Daten:
  638. *************************************************************************
  639.  
  640. PROCEDURE SpeichereSzene(adr:ADDRESS):BOOLEAN;
  641.  
  642.   PROCEDURE MatNum(mp:MaterialPtr):INTEGER;
  643.     VAR
  644.       i   : INTEGER;
  645.       map : MaterialPtr;
  646.     BEGIN
  647.       IF mp#NIL THEN
  648.         i:=0;
  649.         map:=welt.nextmat;
  650.         WHILE map#mp DO
  651.           map:=map^.nextmat;
  652.           INC(i);
  653.         END;
  654.       ELSE
  655.         i:=-1;
  656.       END;
  657.       RETURN i;
  658.     END MatNum;
  659.  
  660.   PROCEDURE SpeichereKoerper;
  661.     PROCEDURE SaveKoerper(op:KoerperPtr; VAR incb:LONGINT);
  662.       VAR
  663.         u  : WEITER;
  664.         ii : INTEGER;
  665.       BEGIN
  666.         IF op#NIL THEN
  667.           Schreibe(ADR(op^.typ),1);
  668.  
  669.           Schreibe(ADR(op^.mp),SIZE(VEKTOR)*2+SIZE(MATRIX)+SIZE(STRING)+
  670.                                SIZE(TEXINFO)+2);
  671.           INC(incb,SIZE(VEKTOR)*2+SIZE(MATRIX)+SIZE(STRING)+
  672.                    SIZE(TEXINFO)+2+2+1+1);
  673.  
  674.           (* Materialnummer herausfinden *)
  675.           ii:=MatNum(op^.mat);
  676.           Schreibe(ADR(ii),2);
  677.  
  678.           IF op^.typ=Flaechen THEN
  679.             Schreibe(ADR(op^.panz),4*SIZE(LONGINT));
  680.             INC(incb,4*SIZE(LONGINT));
  681.           END;
  682.  
  683.           u:=WEITER{};
  684.           IF op^.next#NIL THEN INCL(u,next); END;
  685.  
  686.           IF (op^.typ=Pseudo) AND (op^.adr=NIL) THEN
  687.             INCL(u,pseudoempty);
  688.           END;
  689.           Schreibe(ADR(u),1);
  690.  
  691.           IF op^.typ=Flaechen THEN
  692.  
  693.             Schreibe(op^.padr,SIZE(VEKTOR)*op^.panz);
  694.             Schreibe(op^.kadr,SIZE(CARDINAL)*2*op^.kanz);
  695.             INC(incb,SIZE(VEKTOR)*op^.panz+SIZE(CARDINAL)*2*op^.kanz);
  696.  
  697.             IF op^.dadr#NIL THEN
  698.               Schreibe(op^.dadr,3*SIZE(CARDINAL)*op^.danz);
  699.               INC(incb,3*SIZE(CARDINAL)*op^.danz);
  700.             END;
  701.             IF op^.vadr#NIL THEN
  702.               Schreibe(op^.vadr,4*SIZE(CARDINAL)*op^.vanz);
  703.               INC(incb,4*SIZE(CARDINAL)*op^.vanz);
  704.             END;
  705.           ELSIF op^.typ=Pseudo THEN
  706.             op:=op^.adr;
  707.             WHILE (op#NIL) AND allok DO
  708.               SaveKoerper(op,incb);
  709.               op:=op^.next;
  710.             END;
  711.           END;
  712.         END;
  713.       END SaveKoerper;
  714.  
  715.     VAR
  716.       incb,rb : LONGINT;
  717.       ob      : KoerperPtr;
  718.       byte    : SHORTCARD;
  719.     BEGIN
  720.       Schreibe(ADR('OBJ1'),8);
  721.       incb:=0;
  722.       ob:=welt.nextkoerper;
  723.       WHILE ob#NIL DO
  724.         SaveKoerper(ob,incb);
  725.         ob:=ob^.next;
  726.       END;
  727.       rb:=incb;
  728.       IF ODD(incb) THEN
  729.         byte:=0;
  730.         Schreibe(ADR(byte),1);
  731.         INC(rb);
  732.       END;
  733.       SetPos(-rb-4,current);
  734.       Schreibe(ADR(incb),4);
  735.       SetPos(0,end);
  736.     END SpeichereKoerper;
  737.  
  738.   PROCEDURE SpeichereMaterialien;
  739.     VAR
  740.       bts,rbts : LONGINT;
  741.       mp       : MaterialPtr;
  742.       byte     : SHORTCARD;
  743.       u        : WEITER;
  744.     BEGIN
  745.       Schreibe(ADR('MAT1'),8);
  746.       bts:=0;
  747.       mp:=welt.nextmat;
  748.       WHILE mp#NIL DO
  749.  
  750.         Schreibe(mp,SIZE(MATERIAL)-4*5);
  751.         INC(bts,SIZE(MATERIAL)-4*5+1);
  752.  
  753.         u:=WEITER{};
  754.  
  755.         IF mp^.nextmat#NIL THEN INCL(u,next); END;
  756.         Schreibe(ADR(u),1);
  757.  
  758.         mp:=mp^.nextmat;
  759.       END;
  760.       rbts:=bts;
  761.       IF ODD(bts) THEN
  762.         byte:=0;
  763.         Schreibe(ADR(byte),1);
  764.         INC(rbts);
  765.       END;
  766.       SetPos(-rbts-4,current);
  767.       Schreibe(ADR(bts),4);
  768.       SetPos(0,end);
  769.     END SpeichereMaterialien;
  770.  
  771.   PROCEDURE SpeichereLichter;
  772.     VAR
  773.       bts,rbts : LONGINT;
  774.       lp       : LichtPtr;
  775.       byte     : SHORTCARD;
  776.       u        : WEITER;
  777.     BEGIN
  778.       Schreibe(ADR('LAM1'),8);
  779.       bts:=0;
  780.       lp:=welt.nextlicht;
  781.       WHILE lp#NIL DO
  782.  
  783.         Schreibe(lp,SIZE(LICHT)-4);
  784.         INC(bts,SIZE(LICHT)-4+1);
  785.  
  786.         u:=WEITER{};
  787.  
  788.         IF lp^.nextlicht#NIL THEN INCL(u,next); END;
  789.         Schreibe(ADR(u),1);
  790.  
  791.         lp:=lp^.nextlicht;
  792.       END;
  793.       rbts:=bts;
  794.       IF ODD(bts) THEN
  795.         byte:=0;
  796.         Schreibe(ADR(byte),1);
  797.         INC(rbts);
  798.       END;
  799.       SetPos(-rbts-4,current);
  800.       Schreibe(ADR(bts),4);
  801.       SetPos(0,end);
  802.     END SpeichereLichter;
  803.  
  804.   PROCEDURE SpeicherePolygone;
  805.     VAR
  806.       bts,rbts : LONGINT;
  807.       size     : LONGINT;
  808.       pp       : PolygonPtr;
  809.       byte     : SHORTCARD;
  810.       u        : WEITER;
  811.     BEGIN
  812.       Schreibe(ADR('POLY'),8);
  813.       bts:=0;
  814.       pp:=welt.next;
  815.       WHILE pp#NIL DO
  816.         Schreibe(pp,23); (* Polygon ohne Punkte *)
  817.         INC(bts,23+1);
  818.  
  819.         size:=KoeffizientenGroesse(pp);
  820.  
  821.         Schreibe(ADR(pp^.mp),2*SIZE(VEKTOR));
  822.         Schreibe(pp^.padr,SIZE(VEKTOR)*pp^.anz);
  823.         INC(bts,SIZE(VEKTOR)*pp^.anz+2*SIZE(VEKTOR));
  824.         IF size>0 THEN
  825.           Schreibe(pp^.koadr,size);
  826.           INC(bts,size);
  827.         END;
  828.  
  829.         u:=WEITER{};
  830.         IF pp^.next#NIL THEN INCL(u,next); END;
  831.         Schreibe(ADR(u),1);
  832.         pp:=pp^.next;
  833.       END;
  834.       rbts:=bts;
  835.       IF ODD(bts) THEN
  836.         byte:=0;
  837.         Schreibe(ADR(byte),1);
  838.         INC(rbts);
  839.       END;
  840.       SetPos(-rbts-4,current);
  841.       Schreibe(ADR(bts),4);
  842.       SetPos(0,end);
  843.     END SpeicherePolygone;
  844.  
  845.   PROCEDURE SpeichereUmgebung;
  846.     VAR
  847.       size : LONGINT;
  848.       i    : INTEGER;
  849.     BEGIN
  850.       WITH welt.umgebung DO
  851.         Schreibe(ADR('UMG1'),4);
  852.         size:=6+2*SIZE(boden.info)+SIZE(xyzkamera)-
  853.               3*SIZE(VEKTOR)+SIZE(hintergrund)-4;
  854.  
  855.         Schreibe(ADR(size),4);
  856.         Schreibe(ADR(boden.ex),1);
  857.         Schreibe(ADR(himmel.ex),1);
  858.  
  859.         i:=MatNum(boden.mat);
  860.         Schreibe(ADR(i),2);
  861.         i:=MatNum(himmel.mat);
  862.         Schreibe(ADR(i),2);
  863.  
  864.         Schreibe(ADR(boden.info),SIZE(boden.info));
  865.         Schreibe(ADR(himmel.info),SIZE(himmel.info));
  866.         Schreibe(ADR(xyzkamera),SIZE(xyzkamera)-3*SIZE(VEKTOR));
  867.         Schreibe(ADR(hintergrund),SIZE(hintergrund)-4);
  868.       END;
  869.     END SpeichereUmgebung;
  870.  
  871.   VAR
  872.     size : LONGINT;
  873.     ver  : RECORD
  874.              version,revision : SHORTCARD;
  875.            END;
  876.   BEGIN
  877.     Schreibe(ADR(FORM),8);
  878.     Schreibe(ADR(FRAY),4);
  879.  
  880.     Schreibe(ADR(VERS),4);
  881.     size:=2;
  882.     Schreibe(ADR(size),4);
  883.  
  884.     ver.version:=VERSION; ver.revision:=REVISION;
  885.     Schreibe(ADR(ver),2);
  886.  
  887.     IF welt.nextpolygon#NIL THEN
  888.       SpeicherePolygone;
  889.     END;
  890.     IF welt.nextmat#NIL THEN
  891.       SpeichereMaterialien;
  892.     END;
  893.     SpeichereUmgebung;
  894.     IF welt.nextkoerper#NIL THEN
  895.       SpeichereKoerper;
  896.     END;
  897.     IF welt.nextlicht#NIL THEN
  898.       SpeichereLichter;
  899.     END;
  900.  
  901.     size:=Seek(file,0,end);
  902.     DEC(size,8);
  903.     SetPos(4,beginning);
  904.     Schreibe(ADR(size),4);
  905.   END SpeichereSzene;
  906.  
  907. *******************************************************************************
  908.  
  909. Programmieren von Erweiterungen :
  910.  
  911. Jede Erweiterung ist ein selbstständiges Programm. Sind die Erweiterungen
  912. in die entsprechenden Ordner von Cinema 4D gelegt, werden sie automatisch
  913. erkannt und in das Menü aufgenommen. Erweiterungen für die 68881-er Version
  914. müssen die Endung .881 haben, Erweiterungen für die 68000-er Version
  915. sollten keine Endung haben. Bitte beachten Sie, daß wenn Sie eine
  916. Erweiterung für die 68881-er Version von Cinema 4D programmieren,
  917. überall LONGREAL-Werte anstelle von FFP-Werten eingesetzt werden!
  918.  
  919. Erweiterungen werden von Cinema4D aus aufgestartet. Sie bekommen eine
  920. WBStartup-Message übergeben (siehe AMIGA ROM Kernel Manuals). Nach den
  921. Daten der Startup-Message folgen spezifische Daten, die Cinema4D der
  922. aufgestarteten Erweiterung zur Verfügung stellt. Diese Daten können von
  923. der Erweiterung geändert werden. Bei Programmstart muß abgetestet werden,
  924. daß die übergebene Message genau so groß wie definiert ist, um Abstürze zu
  925. verhindern, falls die Erweiterung von der Workbench oder einem anderen
  926. Programm aufgestartet wird.
  927.  
  928. Die erweiterte Startup-Message sieht folgendermaßend aus:
  929.  
  930. TYPE
  931.   NEWSTARTUPMSG : RECORD
  932.                     wb                                  : WBStartup;
  933.                     sp                                  : ScreenPtr;
  934.                     wp                                  : WindowPtr;
  935.                     nextkoerper,aktukoerper,verzeichnis : KoerperPtr;
  936.                     nextlicht,aktulicht                 : LichtPtr;
  937.                     nextpolygon,aktupolygon             : PolygonPtr;
  938.                     nextmat                             : MaterialPtr;
  939.                     umgebung                            : POINTER TO UMGEBUNG;
  940.                     requester,undo                      : BOOLEAN;
  941.                     center                              : VEKTOR;
  942.                     redrawaktu,fullrefresh              : BOOLEAN;
  943.                     insertkoerper                       : KoerperPtr;
  944.                     verwirbeln                          : KoerperPtr;
  945.                     matrizenanpassen                    : KoerperPtr;
  946.                     rethinkpolygon                      : PolygonPtr;
  947.                     reserved                            : ARRAY [0..99] OF CHAR;
  948.                   END;
  949.  
  950. Alle Werte außer 'sp' und 'wp' dürfen geändert werden.
  951. 'sp' ist der ScreenPtr des Cinema-Bildschirms. 'wp' ist der dazugehörige
  952. WindowPtr. 'nextkoerper' ist ein Zeiger auf den ersten Körper auf höchster
  953. Hierarchie-Ebene. 'aktukoerper' ist ein Zeiger auf den aktiven Koerper.
  954. Ist 'aktukoerper'#NIL, dann wird der entsprechende Körper im Editor in
  955. roter Farbe gezeichnet. Sollte ein Körper von einer Erweiterung gelöscht
  956. werden, so muß überprüft werden, ob 'aktukoerper' nicht darauf zeigt und
  957. gegebenenfalls auf NIL gesetzt werden. 'verzeichnis' zeigt auf den Körper,
  958. der 'aktukoerper' hierarchisch übergeordnet ist. Wenn zum Beispiel
  959. 'aktukoerper' auf das Objekt 'Finger' gesetzt wurde, muß 'verzeichnis' auf
  960. 'Hand' zeigen. Gibt es keinen übergeordneten Körper, dann steht
  961. 'verzeichnis' auf NIL. Da Lichtquellen und Polygone linear verkettet sind,
  962. gibt es nur für Körper den Zeiger 'verzeichnis'. 'nextlicht' und
  963. 'nextpolygon' sind Zeiger auf die jeweils erste Lichtquelle bzw. das erste
  964. Polygon. Wenn 'aktukoerper'#NIL ist, dann müssen 'aktulicht' und
  965. 'aktupolygon' auf NIL stehen und umgekehrt. 'nextmat' ist ein Zeiger auf
  966. das erste Material. 'umgebung' zeigt auf die Umgebungswerte einer Szene.
  967. 'requester' gibt an, ob des Menü mit Shift angewählt wurde. Falls eine
  968. Erweiterung irgendwelche Eingabeparameter benötigt, dann sollte das
  969. Cinema4D-Konzept beibehalten werden: Aufruf ohne Shift-->kein Requester,
  970. Aufruf mit Shift-->Requester.
  971. 'undo' sollte von der Erweiterung auf TRUE gesetzt werden, wenn eine Aktion
  972. rückgängig machbar ist. Nur dann kann der Benutzer den Menüpunkt
  973. Rückgängig anwählen. Nur Aktionen, die den aktiven Körper, die aktive
  974. Lichtquelle oder das aktive Polygon ändern, lassen sich rückgängig machen.
  975. In 'center' steht der Mittelpunkt der Arbeitsoberfläche. Falls irgendwelche
  976. neuen Objekte erzeugt werden, sollten Sie zentriert auf dem Bildschirm
  977. erscheinen.
  978. Mit 'redrawaktu' und 'fullrefresh' teilen Sie Cinema4D mit, was nach der
  979. Beendigung der Erweiterung passieren soll. Standardmäßig stehen beide Werte
  980. auf FALSE, so daß gar nichts passiert. Wird 'redrawaktu' auf TRUE gesetzt,
  981. dann wird das aktive Objekt neu gezeichnet. Wird 'fullrefresh' auf TRUE
  982. gesetzt, dann wird die Szene komplett neu aufgebaut. Dies ist immer dann
  983. erforderlich, wenn die Erweiterung sich an inaktiven Objekten, der Kamera
  984. o.ä. zu schaffen gemacht hat. Soll die gesamte Szene neu gezeichnet werden,
  985. so reicht es, 'fullrefresh' zu setzen. 'redrawaktu' muß nicht gesetzt
  986. werden.
  987. Neue Körper müssen immer an der richtigen Stelle, in dem Verzeichnis
  988. 'verzeichnis' eingehängt werden. Damit Sie als Programmierer nicht so viel
  989. Aufwand haben, können Sie auch einen neu erzeugten Körper in
  990. 'insertkoerper' eintragen. Cinema4D hängt den Körper dann selber in die
  991. Listen an die richtige Stelle ein. Gleichzeitig wird der neue Körper
  992. verwirbelt und aktiviert ('redrawaktu' muß also nicht gesetzt werden).
  993. Soll ein Körper verwirbelt werden, dann kann Cinema4D das für Sie
  994. erledigen. Sie müssen dazu nur einen Zeiger auf den Körper in 'verwirbeln'
  995. eintragen. Wenn Ihre Erweiterung die Punkten eines Körpers verändert,
  996. muß die Körpermatrix- und Textur neu angepaßt werden. Dies ist mitunter
  997. eine recht aufwendige Sache. Auch diese Arbeit können Sie Cinema4D
  998. überlassen, wenn Sie den entsprechenden Körper in 'matrizenanpassen'
  999. eintragen. Bei nichtlinearen Polygonen müssen zusätzlich noch einige
  1000. Koeffizienten angepaßt werden. Dies kann nur das Hauptprogramm erledigen.
  1001. Tragen Sie dazu das Polygon in 'rethinkpolygon' ein.
  1002.  
  1003.  
  1004. Es gibt einige Dinge, die Sie keinesfalls tun dürfen:
  1005.  
  1006. * Polygone löschen
  1007.  
  1008. * Die 'panz' eines nichtlinearen Polygons ändern (wegen der
  1009.   Koeffizientenberechnung)
  1010.  
  1011. * Irgendwelche Speicherbereiche freigeben, ohne den neuen Speicher
  1012.   erhalten zu haben. Wenn Sie beispielsweise das Punktfeld eines Körpers
  1013.   vergrößern wollen, müssen Sie zuerst den neuen Speicher alloziieren und
  1014.   dürfen erst dann den alten in 'padr' angegebenen Speicherbereich freigeben.
  1015.   Ansonsten kann es passieren, daß nicht genügend Speicher für den neuen
  1016.   Speicherbereich zur Verfügung steht und der alte schon freigegeben wurde.
  1017.  
  1018. * sp oder wp verändern
  1019.  
  1020. * Eine Lichtquelle oder einen Körper löschen, ohne 'aktukoerper',
  1021.   'verzeichnis' und 'aktulicht' überprüft zu haben. Wenn ein Körper
  1022.   gelöscht wird, müssen natürlich -falls es sich um ein Verzeichnis
  1023.   handelt- sämtliche Unterkörper überprüft werden.
  1024.  
  1025. * Irgendwelche Werte im reserved-Feld ändern